﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;


//static 成员
//⽤static修饰的成员变量，称之为静态成员变量，静态成员变量⼀定要在类外进⾏初始化
//静态成员变量为所有类对象所共享，不属于某个具体的对象，不存在对象中，存放在静态区
//⽤static修饰的成员函数，称之为静态成员函数，静态成员函数没有this指针。
//静态成员函数中可以访问其他的静态成员，但是不能访问⾮静态的，因为没有this指针。
//⾮静态的成员函数，可以访问任意的静态成员变量和静态成员函数。
//突破类域就可以访问静态成员，可以通过类名::静态成员 或者 对象.静态成员 来访问静态成员变量和静态成员函数。
//静态成员也是类的成员，受public、protected、private 访问限定符的限制。
//静态成员变量不能在声明位置给缺省值初始化，因为缺省值是给构造函数初始化列表的，静态成员变量不属于某个对象，不⾛构造函数初始化列表。


//class A {
//public:
////private:
//	//static在类里声明 在外面初始化
//	static int _scount;
//};
//
////在类外面初始化
//int A::_scount = 0;
//
//
//int main()
//{
//	cout << sizeof(A) << endl;//输出结果为1  static成员不属于类 而是存储在静态区因此不占用A的空间 输出结果为1表示占位
//
//	//访问静态成员 可以通过类和域作用限定符 也可以通过实例化的对象
//	//需要转换成public才可以访问
//	/*cout << A::_scount << endl;*/
//
//	A aa1;
//	A aa2;
//	cout << aa1._scount << endl;
//	cout << aa2._scount << endl;
//	return 0;
//}

//class A
//{
//public:
//	A()
//	{
//		++_scount;
//	}
//	A(const A& t)
//	{
//		++_scount;
//	}
//	~A()
//	{
//		--_scount;
//	}
//
//	static int GetACount()
//	{
//		//++_a1;  //错误 因为静态成员函数没有this指针 不能访问非静态成员变量
//		return _scount;
//	}
//private:
//	//类里面声明
//	static int _scount;
//	int _a1 = 1;
//	int _a2 = 2;
//};
////类外初始化
//int A::_scount = 0;
//
//
//int main()
//{
//	cout << A::GetACount() << endl;
//	A aa1, aa2;
//	A aa3(aa1);
//	cout << A::GetACount() << endl;
//	cout << aa1.GetACount() << endl;
//	/*cout << A::_scount << endl;*/  //private中的静态成员变量 不能通过这样访问
//	return 0;
//}


//应用:
//求1+2+3+......+n 不能使用乘除法 for、while、if、else、switch、case等关键字及条件判断语句
//累加n次 就是调用n次构造函数 利用static成员生命周期延长的特性实现

class Sum
{
public:
	Sum()
	{
		_ret += _i;
		_i++;
	}

	static int GetRet()
	{
		return _ret;
	}
private:
	static int _i;
	static int _ret;
};

int Sum::_i = 1;
int Sum::_ret = 0;

class Solution {
public:
	int Sum_Solution(int n) {
		// 变长数组
		//Sum a[n];
		Sum* a = new Sum[n];
		delete[] a;
		return Sum::GetRet();
	}
};
